#include "head.h"


// 功能：处理gets
int dealGets(int sockfd, char *path){
    // 获取指令
    /* train_t train; */
    /* getInstruction(sockfd, &train); */
    /* printf("instruction is --%s--\n", train.buf); */
    
    // 获取需要下载的地址和文件
    /* train_t fileMess; */
    /* getInstruction(sockfd, &fileMess); */
    /* printf("path --%s--\n", fileMess.buf); */
    
    // 收客户端目前拥有此文件多大
    train_t cLen;
    getTL(sockfd, &cLen);

    printf("cur len --%d--\n", cLen.len);

    int fd = open(path, O_RDWR);
    int fileSize = lseek(fd, 0, SEEK_END);
    lseek(fd, 0, SEEK_SET);
    
    printf("file size : %d\n", fileSize);
    printf("senf size: %d\n", fileSize - cLen.len);
    
    // 响应目前客户端会发送多少字节
    TLVResponseLen(sockfd, fileSize - cLen.len, FILE_LEN);

    ftruncate(fd, fileSize);

    off_t offset = cLen.len;
    sendfile(sockfd, fd, &offset, fileSize - cLen.len);

    close(fd);
    return 0;
}

// 功能：处理来自客户端的上传请求
int dealPuts(int sockfd, char *path){
    int fd = open(path, O_RDWR | O_CREAT, 0666);
    
    int fileSize = lseek(fd, 0, SEEK_END);
    
    // 响应目前文件的大小
    TLVResponseLen(sockfd, fileSize, FILE_LEN);
    
    // 接收来自客户端的确认
    train_t mess;
    getTL(sockfd, &mess);
    //  文件不一致，不能上传
    if(mess.type == CANCEL){
        return -1;
    }
    
    // 预留空间大小
    ftruncate(fd, mess.len + fileSize);
    
    char *buf = (char *)mmap(NULL, mess.len + fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    recv(sockfd, buf + fileSize, mess.len, MSG_WAITALL);

    munmap(buf, mess.len + fileSize);
    return 0;
}

// 功能：与客户端进行交互的逻辑
int interactWithTheClient(int sockfd){
    // 接收gets
 //   printf("hello world\n");
 //   /* dealGets(sockfd); */
 //   
 //   // 获取指令
 //   train_t instruction;

 //   train_t path;
 //   getInstruction(sockfd, &instruction);

    // 非单地址指令，获取地址
 //   if(instruction.type != ONE_instruction){
 //       getInstruction(sockfd, &path);
 //   }

 //   printf("cur instruction : %s\n", instruction.buf);
 //   printf("cur path : %s\n", path.buf);

 //   // 指令分发
 //   if(!strcmp(instruction.buf, "puts")){
 //       dealPuts(sockfd, path.buf);
 //   }else if (!strcmp(instruction.buf, "gets")){
 //       dealGets(sockfd, path.buf);
 //   }

    return 0;
}

